#!/bin/bash
# -*- coding: utf-8 -*-
# Docker部署脚本 - 杜伊斯堡签证预约系统
# 专注于服务构建和启动

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
PROJECT_NAME="duisburg_visa_extension"
PROJECT_DIR="/appHome/$PROJECT_NAME"
COMPOSE_FILE="docker-compose.yml"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要root权限运行"
        log_info "请使用: sudo $0"
        exit 1
    fi
}

# 检查Docker和Docker Compose
check_docker() {
    log_info "检查Docker环境..."
    
    # 检查Docker
    if ! command -v docker &> /dev/null; then
        log_error "Docker未安装，请先安装Docker"
        exit 1
    fi
    
    # 检查Docker Compose
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose未安装，请先安装Docker Compose"
        exit 1
    fi
    
    # 检查Docker服务状态
    if ! systemctl is-active --quiet docker; then
        log_info "启动Docker服务..."
        systemctl start docker
    fi
    
    log_success "Docker环境检查通过"
}

# 检查项目目录
check_project_dir() {
    log_info "检查项目目录..."
    
    if [[ ! -d "$PROJECT_DIR" ]]; then
        log_error "项目目录不存在: $PROJECT_DIR"
        log_info "请确保项目已正确部署到指定目录"
        exit 1
    fi
    
    if [[ ! -f "$PROJECT_DIR/$COMPOSE_FILE" ]]; then
        log_error "Docker Compose文件不存在: $PROJECT_DIR/$COMPOSE_FILE"
        exit 1
    fi
    
    log_success "项目目录检查通过"
}

# 检查端口占用
check_ports() {
    log_info "检查端口占用..."
    
    # 检查5001端口（后端）
    if netstat -tlnp | grep -q ":5001 "; then
        log_warning "端口5001已被占用，请检查是否有其他服务在使用"
    fi
    
    # 检查3000端口（前端）
    if netstat -tlnp | grep -q ":3000 "; then
        log_warning "端口3000已被占用，请检查是否有其他服务在使用"
    fi
    
    log_success "端口检查完成"
}

# 构建Docker镜像
build_images() {
    log_info "构建Docker镜像..."
    
    cd "$PROJECT_DIR"
    
    # 构建后端镜像
    log_info "构建后端镜像..."
    docker-compose -f "$COMPOSE_FILE" build backend
    
    # 构建前端镜像
    log_info "构建前端镜像..."
    docker-compose -f "$COMPOSE_FILE" build frontend
    
    log_success "Docker镜像构建完成"
}

# 停止现有服务
stop_services() {
    log_info "停止现有服务..."
    
    cd "$PROJECT_DIR"
    
    if docker-compose -f "$COMPOSE_FILE" ps -q | grep -q .; then
        docker-compose -f "$COMPOSE_FILE" down
        log_success "现有服务已停止"
    else
        log_info "没有运行中的服务"
    fi
}

# 启动服务
start_services() {
    log_info "启动Docker服务..."
    
    cd "$PROJECT_DIR"
    
    # 启动所有服务
    docker-compose -f "$COMPOSE_FILE" up -d
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 10
    
    # 检查服务状态
    docker-compose -f "$COMPOSE_FILE" ps
    
    log_success "Docker服务启动完成"
}

# 检查服务健康状态
check_health() {
    log_info "检查服务健康状态..."
    
    local max_attempts=30
    local attempt=1
    
    while [[ $attempt -le $max_attempts ]]; do
        log_info "健康检查尝试 $attempt/$max_attempts"
        
        # 检查后端健康状态
        if curl -f -s "http://localhost:5001/api/health" > /dev/null; then
            log_success "后端服务健康检查通过"
            break
        fi
        
        if [[ $attempt -eq $max_attempts ]]; then
            log_error "后端服务健康检查失败"
            log_info "查看服务日志: docker-compose -f $COMPOSE_FILE logs"
            exit 1
        fi
        
        sleep 5
        ((attempt++))
    done
}

# 显示部署信息
show_deployment_info() {
    log_success "Docker部署完成！"
    echo
    log_info "服务访问地址:"
    log_info "  后端API: http://localhost:5001"
    log_info "  前端界面: http://localhost:3000"
    log_info "  健康检查: http://localhost:5001/api/health"
    log_info "项目目录: $PROJECT_DIR"
    echo
    log_info "常用命令:"
    log_info "  查看服务状态: docker-compose -f $COMPOSE_FILE ps"
    log_info "  查看服务日志: docker-compose -f $COMPOSE_FILE logs -f"
    log_info "  重启服务: docker-compose -f $COMPOSE_FILE restart"
    log_info "  停止服务: docker-compose -f $COMPOSE_FILE down"
    log_info "  更新服务: docker-compose -f $COMPOSE_FILE pull && docker-compose -f $COMPOSE_FILE up -d"
    echo
    log_info "服务管理:"
    log_info "  后端服务: duisburg_visa_backend (端口: 5001)"
    log_info "  前端服务: duisburg_visa_frontend (端口: 3000)"
    echo
    log_info "日志文件:"
    log_info "  应用日志: $PROJECT_DIR/logs/"
    log_info "  容器日志: docker-compose -f $COMPOSE_FILE logs"
}

# 主函数
main() {
    log_info "开始Docker部署杜伊斯堡签证预约系统..."
    log_info "项目目录: $PROJECT_DIR"
    echo
    
    check_root
    check_docker
    check_project_dir
    check_ports
    stop_services
    build_images
    start_services
    check_health
    
    echo
    show_deployment_info
}

# 运行主函数
main "$@"
